package net.comm.pic;

import java.io.File;
import java.util.List;

import net.comm.common.GlbFinal;

public class ConvertVideo {

	//待转换文件存放路径
	private String path;

	//转换程序存放路径
	private String prgpath;
	
	public ConvertVideo(String filepath, String ppath){
		path = filepath;
		prgpath = ppath;
	}
	
	 public static void main(String[] args) {
		 
		 ConvertVideo  cvideo = new ConvertVideo("D:\\eclipse3.2workspaces\\fcwrw\\WebRoot" ,
				 "D:\\eclipse3.2workspaces\\fcwrw\\WebRoot" );
		 
		 String file = "lzl.mp4";
	        if(!checkfile(cvideo.path + file)){
	         System.out.println(file+" is not file");
	         return;
	        }       
	  if (cvideo.process(file)) {                 
	            System.out.println("ok");
	        }
	 }
	 
	 public boolean process(String file) {       
	  int type = checkContentType( file);
	        boolean status = false;
	        if (type==0) {
	            status = processFLV(path + file);// 直接将文件转为flv文件           
	        } else if (type==1) {
	        	return false;
	        	//暂不支持wmv9，rm，rmvb等格式
//	            String avifilepath = processAVI(type);
//	            if (avifilepath == null)
//	                return false;// avi文件没有得到
//	            status = processFLV(avifilepath);// 将avi转为flv
	        }
	        return status;
	 }
	 private int checkContentType(String file) {
	        String type = file.substring(file.lastIndexOf(".") + 1, file.length()).toLowerCase();
	        //ffmpeg能解析的格式：（asx，asf，mpg，wmv，3gp，mp4，mov，avi，flv等）
	        if (type.equals("avi")) {
	            return 0;
	        } else if (type.equals("mpg")) {
	            return 0;
	        } else if (type.equals("wmv")) {
	            return 0;
	        } else if (type.equals("3gp")) {
	            return 0;
	        } else if (type.equals("mov")) {
	            return 0;
	        } else if (type.equals("mp4")) {
	            return 0;
	        } else if (type.equals("asf")) {
	            return 0;
	        } else if (type.equals("asx")) {
	            return 0;
	        } else if (type.equals("flv")) {
	            return 0;
	        }
	        //对ffmpeg无法解析的文件格式(wmv9，rm，rmvb等), 可以先用别的工具（mencoder）转换为avi(ffmpeg能解析的)格式.
	        else if (type.equals("wmv9")) {
	            return 1;
	        } else if (type.equals("rm")) {
	            return 1;
	        } else if (type.equals("rmvb")) {
	            return 1;
	        }       
	        return 9;
	    }
	   
	private static boolean checkfile(String pathfile){
	     File file=new File(pathfile);
	     if(!file.isFile()){
	      return false;
	     }
	     return true;
	}
//	//  对ffmpeg无法解析的文件格式(wmv9，rm，rmvb等), 可以先用别的工具（mencoder）转换为avi(ffmpeg能解析的)格式.
//	private static String processAVI(int type) {
//	        List<String> commend=new java.util.ArrayList<String>();
//	        commend.add("e:\\mencoder");
//	        commend.add(PATH);
//	        commend.add("-oac");
//	        commend.add("lavc");
//	        commend.add("-lavcopts");
//	        commend.add("acodec=mp3:abitrate=64");
//	        commend.add("-ovc");
//	        commend.add("xvid");
//	        commend.add("-xvidencopts");
//	        commend.add("bitrate=600");
//	        commend.add("-of");
//	        commend.add("avi");
//	        commend.add("-o");
//	        commend.add("c:\\home\\a.avi");
//	       
//	        try{
//	         ProcessBuilder builder = new ProcessBuilder();
//	            builder.command(commend);
//	            builder.start();
//	            return "c:\\home\\a.avi";
//	        }catch(Exception e){
//	         e.printStackTrace();
//	         return null;
//	        }
//	    }
		/*ffmpeg参数设定解说 
		-bitexact 使用标准比特率 
		-vcodec xvid 使用xvid压缩 
		-s 320x240 指定分辨率 
		-r 29.97 桢速率（可以改，确认非标准桢率会导致音画不同步，所以只能设定为15或者29.97） 
		画面部分，选其一 
		-b <比特率> 指定压缩比特率，似乎ffmpeg是自动VBR的，指定了就大概是平均比特率，比如768，1500这样的
		就是原来默认项目中有的 
		-qscale <数值> 以<数值>质量为基础的VBR，取值0.01-255，约小质量越好 
		-qmin <数值> 设定最小质量，与-qmax（设定最大质量）共用，比如-qmin 10 -qmax 31 
		-sameq 使用和源同样的质量 
		声音部分 
		-acodec aac 设定声音编码 
		-ac <数值> 设定声道数，1就是单声道，2就是立体声，转换单声道的TVrip可以用1（节省一半容量），高品质
		的DVDrip就可以用2 
		-ar <采样率> 设定声音采样率，PSP只认24000 
		-ab <比特率> 设定声音比特率，前面-ac设为立体声时要以一半比特率来设置，比如192kbps的就设成96，转换
		君默认比特率都较小，要听到较高品质声音的话建议设到160kbps（80）以上 
		-vol <百分比> 设定音量，某些DVDrip的AC3轨音量极小，转换时可以用这个提高音量，比如200就是原来的2倍 
		这样，要得到一个高画质音质低容量的MP4的话，首先画面最好不要用固定比特率，而用VBR参数让程序自己去
		判断，而音质参数可以在原来的基础上提升一点，听起来要舒服很多，也不会太大（看情况调整
		例子：ffmpeg -y -i "1.avi" -title "Test" -vcodec xvid -s 368x208 -r 29.97 -b 1500 -acodec aac -ac 2 -ar 24000 -ab 128 -vol 200 -f psp -muxvb 768 "1.***"
		
		解释：以上命令可以在Dos命令行中输入，也可以创建到批处理文件中运行。不过，前提是：要在ffmpeg所在的目录中执行（转换君所在目录下面的cores子目录）。
		参数：
		-y（覆盖输出文件，即如果1.***文件已经存在的话，不经提示就覆盖掉了）
		-i "1.avi"（输入文件是和ffmpeg在同一目录下的1.avi文件，可以自己加路径，改名字）
		-title "Test"（在PSP中显示的影片的标题）
		-vcodec xvid（使用XVID编码压缩视频，不能改的）
		-s 368x208（输出的分辨率为368x208，注意片源一定要是16:9的不然会变形）
		-r 29.97（帧数，一般就用这个吧）
		-b 1500（视频数据流量，用-b xxxx的指令则使用固定码率，数字随便改，1500以上没效果；还可以用动态码率如：-qscale 4和-qscale 6，4的质量比6高）
		-acodec aac（音频编码用AAC）
		-ac 2（声道数1或2）
		-ar 24000（声音的采样频率，好像PSP只能支持24000Hz）
		-ab 128（音频数据流量，一般选择32、64、96、128）
		-vol 200（200%的音量，自己改）
		-f psp（输出psp专用格式）
		-muxvb 768（好像是给PSP机器识别的码率，一般选择384、512和768，我改成1500，PSP就说文件损坏了）
		"1.***"（输出文件名，也可以加路径改文件名）
		*/	
	
	//  ffmpeg能解析的格式：（asx，asf，mpg，wmv，3gp，mp4，mov，avi，flv等）
	private boolean processFLV(String oldfile) {
	     
	      if(!checkfile(oldfile)){
	          System.out.println(oldfile+" is not file");
	          return false;
	      }     
	         String newfile = oldfile.substring(0, oldfile.lastIndexOf(".")) + ".flv";

	        List<String> commend=new java.util.ArrayList<String>();
	        commend.add(prgpath+ "ffmpeg");//
	        commend.add("-i");
	        commend.add(oldfile);
	        commend.add("-ab");
	        commend.add("64");
	        commend.add("-ac");
	        commend.add("2");
	        commend.add("-ar");
	        commend.add("22050");
	        commend.add("-b");
	        commend.add("800000");
	        commend.add("-y");
	        commend.add("-s");
	        commend.add("640*480");
	        commend.add("-r");
	        commend.add("24");
	        commend.add(newfile);
	        
	        try {
	            ProcessBuilder builder = new ProcessBuilder();
	            builder.command(commend);
	            builder.start();
//	            Process p = builder.start();
                
//                 //将执行结果打印显示
//                InputStream is = p.getErrorStream();
//                InputStreamReader isr = new InputStreamReader(is, "GBK");
//                BufferedReader br = new BufferedReader(isr);
//                String line;
// 
//                while ((line = br.readLine()) != null)
//                {
//                    System.out.println(line);
//                }

            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
	            return false;
           }
            return true;
	    }
	//  ffmpeg 生成视频截屏文件， 格式：jpg 
	/*
	 * mm：开始时间
	 * 
	 * -ss后跟的时间单位为秒 
	 * 
	 */
	public String processPIC(String oldfile, String mm) {
	     
		String newfile = "";
	      if(!checkfile(path + oldfile)){
	          System.out.println(path + oldfile+" is not file");
	          return newfile;
	      }     
	       	newfile = oldfile.substring(0, oldfile.lastIndexOf(".")) + ".jpg";

	        List<String> commend=new java.util.ArrayList<String>();
	        commend.add(prgpath+ "ffmpeg");//
	        commend.add("-i");
	        commend.add(path + oldfile);
	        commend.add("-y");
	        commend.add("-f");
	        commend.add("image2");
	        commend.add("-t");
	        commend.add("1");
	        commend.add("-ss");
	        commend.add(mm);
	        commend.add("-s");
	        commend.add("640*480");
	        commend.add(path + newfile);
	        
	        try {
	            ProcessBuilder builder = new ProcessBuilder();
	            builder.command(commend);
	            builder.start();
//	            Process p = builder.start();
//                
//                 //将执行结果打印显示
//                InputStream is = p.getErrorStream();
//                InputStreamReader isr = new InputStreamReader(is, "GBK");
//                BufferedReader br = new BufferedReader(isr);
//                String line;
// 
//                while ((line = br.readLine()) != null)
//                {
//                    System.out.println(line);
//                }

            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block
    	        System.out.println("截图失败"+ mm);

                e.printStackTrace();
	            return newfile;
           }
            return newfile;
	    }	
}
